﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Vendedores;
using Onshi.POS.Vendedores.Vistas;

namespace Onshi.POS.Formularios.Cliente
{
    public partial class RubrosVendedoresAltaBajaModificacion : FormularioBase, IRubrosVendedoresAltaBajaModificacion
    {
        #region Constructores

        public RubrosVendedoresAltaBajaModificacion(Boolean esSeleccion)
        {
            InitializeComponent();
            btnSeleccionar.Visible = esSeleccion;
            presentador = new RubrosVendedoresAltaBajaModificacionPresentador(this);
        }

        #endregion

        #region Atributos

        private RubrosVendedoresAltaBajaModificacionPresentador presentador;
        private Int32 idRubro;
        private RubroVendedor rubroSelecionado;
        private EnumEstadoAltaBajaModificacionHabilitacion estadoAbm;
        private List<RubroVendedor> listaReporte;

        #endregion

        #region Propiedades

        public RubroVendedor RubroSeleccionado
        {
            get { return rubroSelecionado; }
        }

        public Int32 IdRubro
        {
            get { return idRubro; }
        }

        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        public String Observacion
        {
            get { return txtObservacion.Text; }
        }

        public EnumEstadoCheck TieneObservacionFiltro
        {
            get
            {
                var valor = EnumEstadoCheck.TODOS;
                switch (chkTieneObservacionFiltro.CheckState)
                {
                    case CheckState.Checked:
                        valor = EnumEstadoCheck.SI;
                        break;
                    case CheckState.Indeterminate:
                        valor = EnumEstadoCheck.TODOS;
                        break;
                    case CheckState.Unchecked:
                        valor = EnumEstadoCheck.NO;
                        break;
                }
                return valor;
            }
        }

        public EnumEstadoAltaBajaModificacionHabilitacion EstadoABM
        {
            get { return estadoAbm; }
        }

        public List<RubroVendedor> Lista
        {
            set { bsRubrosVendedores.DataSource = value; }
        }

        public List<RubroVendedor> ListaReporte
        {
            set { listaReporte = value; }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsRubrosVendedores.Current != null)
            {
                txtNombre.Text = ((RubroVendedor)bsRubrosVendedores.Current).Nombre;
                txtObservacion.Text = ((RubroVendedor)bsRubrosVendedores.Current).Observacion;
                idRubro = ((RubroVendedor)bsRubrosVendedores.Current).Id;
            }
            else
                LimpiarCampos();
        }

        private void HabilitarControles()
        {
            txtNombre.Enabled = !txtNombre.Enabled;
            txtObservacion.Enabled = !txtObservacion.Enabled;
            btnNuevo.Enabled = !btnNuevo.Enabled;
            btnModficiar.Enabled = !btnModficiar.Enabled;
            btnEliminar.Enabled = !btnEliminar.Enabled;
            btnAceptar.Enabled = !btnAceptar.Enabled;
            btnCancelar.Enabled = !btnCancelar.Enabled;
            navRubrosVendedores.Enabled = !navRubrosVendedores.Enabled;
            btnSeleccionar.Enabled = !btnSeleccionar.Enabled;
        }

        private void LimpiarCampos()
        {
            idRubro = 0;
            txtNombre.Text = String.Empty;
            txtObservacion.Text = String.Empty;
        }

        private void LimpiarFiltro()
        {
            txtNombreFiltro.Text = String.Empty;
            chkTieneObservacionFiltro.CheckState = CheckState.Indeterminate;
        }

        #endregion

        #region Eventos

        private void btnVerObservacion_Click(Object sender, EventArgs e)
        {
            if (bsRubrosVendedores.Current != null)
            {
                var rubroVendedor = ((RubroVendedor)bsRubrosVendedores.Current);
                if (rubroVendedor.TieneObservacion == true)
                {
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.RUBRO_VENDEDOR, rubroVendedor.Nombre, rubroVendedor.Observacion);
                    observacionVer.ShowDialog();
                }
            }
        }

        private void btnImprimir_Click(Object sender, EventArgs e)
        {
            try
            {
                presentador.Imprimir();
                var reporte = new Reportes(listaReporte);
                reporte.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void RubrosVendedoresAltaBajaModificacion_Load(Object sender, EventArgs e)
        {
            try
            {
                presentador.Inicializar();
                ucUltimaActualizacion.Actualizar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles();
            txtNombre.Focus();
            estadoAbm = EnumEstadoAltaBajaModificacionHabilitacion.ALTA;
        }

        private void btnModficiar_Click(Object sender, EventArgs e)
        {
            if (bsRubrosVendedores.Current != null)
            {
                if (((RubroVendedor)bsRubrosVendedores.Current).Id != (Int32)EnumRubroVendedor.RUBRO_UNICO)
                {
                    HabilitarControles();
                    txtNombre.Focus();
                    estadoAbm = EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION;
                }
                else
                    MessageBox.Show("Este rubro no se puede modificar", DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            try
            {
                if (bsRubrosVendedores.Current != null)
                {
                    if (((RubroVendedor)bsRubrosVendedores.Current).Id != (Int32)EnumRubroVendedor.RUBRO_UNICO)
                    {
                        if (MessageBox.Show("¿Esta seguro que desea eliminar el rubro seleccionado?"
                            + Environment.NewLine
                            + "Todos los vendedores que lo utilicen se actualizarán con el rubro por defecto", DatosComunes.NombreAplicacion, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                        {
                            estadoAbm = EnumEstadoAltaBajaModificacionHabilitacion.BAJA;
                            presentador.Eliminar();
                            solRubrosVendedores.SelectedTab = tabLista;
                            ucUltimaActualizacion.Actualizar();
                        }
                    }
                    else
                        MessageBox.Show("Este rubro no se puede eliminar", DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            try
            {
                var ok = true;
                errRubrosVendedores.Clear();
                if (txtNombre.Text.Trim() == String.Empty)
                {
                    ok = false;
                    errRubrosVendedores.SetError(txtNombre, DatosComunes.CompletarCampo);
                }
                if (ok)
                {
                    presentador.Aceptar();
                    HabilitarControles();
                    solRubrosVendedores.SelectedTab = tabLista;
                    ucUltimaActualizacion.Actualizar();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles();
            ActualizarCampos();
            errRubrosVendedores.Clear();
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            try
            {
                presentador.Filtrar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void solRubrosVendedores_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (btnAceptar.Enabled)
                e.Cancel = true;
        }

        private void grdRubrosVendedores_SelectionChanged(Object sender, EventArgs e)
        {
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            try
            {
                presentador.Actualizar();
                ucUltimaActualizacion.Actualizar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
        }

        private void grdRubrosVendedores_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (grdRubrosVendedores.Columns[e.ColumnIndex].Name == colObservacion.Name)
            {
                if (((RubroVendedor)bsRubrosVendedores.List[e.RowIndex]).TieneObservacion == true)
                    e.Value = Properties.Resources.page_copy;
            }
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            if (bsRubrosVendedores.Current != null)
            {
                rubroSelecionado = (RubroVendedor)bsRubrosVendedores.Current;
                DialogResult = System.Windows.Forms.DialogResult.OK;
            }
            else
                MessageBox.Show("No hay ningun rubro seleccionado", DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void grdRubrosVendedores_CellContentClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                if (grdRubrosVendedores.Columns[e.ColumnIndex].Name == colObservacion.Name)
                {
                    var rubroVendedor = ((RubroVendedor)bsRubrosVendedores.List[e.RowIndex]);
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.RUBRO_VENDEDOR, rubroVendedor.Nombre, rubroVendedor.Observacion);
                    observacionVer.ShowDialog();
                }
            }
        }

        private void chkTieneObservacionFiltro_CheckStateChanged(Object sender, EventArgs e)
        {
            try
            {
                presentador.Filtrar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        #endregion
    }
}
